<?php

class router {
	
	private $routes = NULL;
	
	/**
	 * @param string $routes Файл с маршрутами
	 */
	function __construct($routes) {
		$this->routes = include($routes);
	}
	
	/**
	 * Получает параметры запроса
	 */
	function get_params() {
		if (array_search('', $_GET) === false) {
			header('Location: ?/index');
			exit;
		}
		return trim(array_search('', $_GET), "/");
	}
	
	function run() {
		global $CFG;
		$params = $this->get_params();
		
		// Пытаемся применить к нему правила из конфигуации.
		foreach ($this->routes as $pattern => $route) {
			// Если правило совпало.
			if (preg_match("~^$pattern$~", $params)) {
				// Получаем внутренний путь из внешнего согласно правилу.
				$internalRoute = preg_replace("~$pattern~", $route, $params);
				// Разбиваем внутренний путь на сегменты.
				$segments = explode('/', $internalRoute);
				// Первый сегмент — контроллер.
				$controller_dir = strtolower(array_shift($segments));
				$controller_name = $controller_dir . '_controller';
				// Второй — действие.
				$action = 'action_' . strtolower(array_shift($segments));
				// Остальные сегменты — параметры.
				$parameters = $segments;
		
				// Подключаем файл контроллера, если он имеется
				$controllerFile = $CFG->app_dir . "/$controller_dir/class.$controller_name.php";
				if (file_exists($controllerFile)) {
					include($controllerFile);
				}
		
				// Если не загружен нужный класс контроллера или в нём нет
				// нужного метода — 404 
				if (! is_callable(array($controller_name, $action))) {
					header("HTTP/1.1 404 Not Found");
					return;
				}
				// Вызываем действие контроллера с параметрами
				$controller = new $controller_name($parameters);
				$controller->$action();
				exit;
			}
		}
		
		// Ничего не применилось. 404.
		header("HTTP/1.1 404 Not Found");
		return;
    }
	
	function __destruct() {
		
	}
}

?>
